﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Chilis.Proveedores.TransferObjects;
using Chilis.Proveedores.DataAccess;

namespace Chilis.Proveedores.Services
{
    public class AdministracionService
    {        

        public IList<ConvocatoriaDTO> GetConvocatorias()
        {
            return ConvocatoriaDA.GetAllConvocatoria();
        }

        public ConvocatoriaDTO GetConvocatoriaById(int idConvocatoria)
        {
            return ConvocatoriaDA.GetConvocatoriaById(idConvocatoria);
        }

        public IList<PropuestaDTO> SearchPropuesta(string idConvocatoria, string idProveedor, string nombrePropuesta)
        {
            return PropuestaDA.SearchPropuesta(idConvocatoria, idProveedor, nombrePropuesta);
        }

        public string AddPropuesta(PropuestaDTO propuesta)
        {
            //Hacer validaciones
            var validaFecha = default(DateTime);
            if (propuesta.Convocatoria.Equals(0))
                return "0|Seleccionar convocatoria";
            if (propuesta.Preseleccionado.Equals(0))
                return "0|Seleccionar proveedor";
            if (propuesta.FechaPropuesta.Equals(validaFecha))
                return "0|Debe completar los datos de la propuesta";
            if (propuesta.CodigoProveedor.Equals(""))
                return "0|Debe completar los datos de la propuesta";
            if (propuesta.Propuesta.Equals(""))
                return "0|Debe completar los datos de la propuesta";

            var Convocatoria = this.GetConvocatoriaById(propuesta.Convocatoria);

            if(!propuesta.FechaPropuesta.Value.Between(Convocatoria.FechaCreacion.Value, Convocatoria.FechaFin.Value))
                return "0|La fecha de propuesta debe estar en el rango de la fecha de inicio y fin de la convocatoria";

            if (Convocatoria.Visita.Value)
            {
                if (propuesta.FechaVisita.Equals(validaFecha))
                    return "0|La convocatoria solicita una fecha de visita";

                if (propuesta.FechaVisita.Value.Between(Convocatoria.FechaCreacion.Value, propuesta.FechaPropuesta.Value))
                    return "0|La fecha de visita debe estar en el rango de la fecha de inicio de convocaoria y la fecha de propuesta";
            }
            else
                if (propuesta.FechaVisita.Equals(validaFecha))
                    propuesta.FechaVisita = null;

            var codigo = PropuestaDA.AddPropuesta(propuesta);
            if (codigo.Equals(0))
            {
                return "0|Error al registrar";
            }

            return "1|Se guardó la propuesta con código " + codigo.ToString();
        }        

        public IList<EstadoConvocatoriaDTO> GetAllEstadoConvocatoria()
        {
            return EstadoConvocatoriaDA.GetAllEstadoConvocatoria();
        }

        #region Area
        public IList<AreaDTO> GetAllArea()
        {
            return AreaDA.GetAllArea();
        }

        public IList<AreaDTO> SearchAreas(string nombre)
        {
            return AreaDA.SearchArea(nombre);
        }

        public AreaDTO GetArea(int idArea)
        {
            return AreaDA.GetArea(idArea);
        }

        public string AddArea(AreaDTO area)
        {
            var validar = this.ValidateArea(area);
            if (!validar.Equals(""))
                return validar;

            var codigo = AreaDA.AddCriterio(area);

            if (codigo.Equals(0))
                return "0|Error al registrar área";
            else
                return "1|Se guardó el área con código " + codigo.ToString();
        }

        public string UpdateArea(AreaDTO area)
        {

            var validar = this.ValidateArea(area);
            if (!validar.Equals(""))
                return validar;

            var codigo = AreaDA.UpdateArea(area);

            return "1|Se actualizó el área con código " + codigo.ToString();
        }

        protected string ValidateArea(AreaDTO area)
        {
            if (area.NombreArea == null)
                return "0|Ingresar nombre";

            var lista = AreaDA.SearchAreaName(area.NombreArea);
            if (lista.Where(c => !c.IdArea.Equals(area.IdArea)).Any())
            {
                return "0|Ya existe un registro con la misma información ingresada";
            }

            return "";

        }

        public string DeleteArea(int idArea)
        {
            if (AreaDA.DeleteArea(idArea))
                return "1|Se eliminó el área con código " + idArea.ToString();
            else
                return "0|No se puede eliminar el área.\nExisten Plantillas de Evaluación asociadas.";
        }
        #endregion

        #region Criterio
        public IList<CriterioDTO> GetCriterios()
        {
            return CriterioDA.GetAllCriterio();
        }

        public IList<CriterioDTO> SearchCriterios(string nombre)
        {
            return CriterioDA.SearchCriterio(nombre);
        }

        public CriterioDTO GetCriterio(int idCriterio)
        {
            return CriterioDA.GetCriterio(idCriterio);
        }

        public string AddCriterio(CriterioDTO criterio)
        {
            var validar = this.ValidateCriterio(criterio);
            if (!validar.Equals(""))
                return validar;

            var codigo = CriterioDA.AddCriterio(criterio);

            if (codigo.Equals(0))
                return "0|Error al registrar criterio";
            else
                return "1|Se guardó el criterio con código " + codigo.ToString();
        }

        public string UpdateCriterio(CriterioDTO criterio)
        {

            var validar = this.ValidateCriterio(criterio);
            if (!validar.Equals(""))
                return validar;

            var codigo = CriterioDA.UpdateCriterio(criterio);

            return "1|Se actualizó el criterio con código " + codigo.ToString();
        }

        protected string ValidateCriterio(CriterioDTO criterio)
        {
            if (criterio.Nombre == null)
                return "0|Ingresar nombre";
            if (criterio.Descripcion == null)
                return "0|Ingresar descripción";
            var lista = CriterioDA.SearchCriterioName(criterio.Nombre);
            if (lista.Where(c => !c.IdCriterio.Equals(criterio.IdCriterio)).Any())
            {
                return "0|Ya existe un registro con la misma información ingresada";
            }

            return "";
            
        }

        public string DeleteCriterio(int idCriterio)
        {

            if (CriterioDA.DeleteCriterio(idCriterio))
                return "1|Se eliminó el criterio con código " + idCriterio.ToString();
            else
                return "0|No se puede eliminar el criterio.\nExisten Plantillas de Evaluación asociadas.";
        }
        #endregion

        #region SubCriterio
        public IList<SubCriterioDTO> GetSubCriterios(int idCriterio)
        {
            return SubCriterioDA.GetListSubCriterio(idCriterio);
        }
        #endregion
    }
}
